package com.bite.rabbitmq.listener;


import com.bite.rabbitmq.constant.Constants;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@RabbitListener(queues = Constants.ACK_QUEUE)
//@Component
public class AckListener {
    // 如果使用这种 那么就要设置为true 因为默认(false)是根据类型来查找 显然就没有Message这种类型的对象 所以报错
    @RabbitHandler(isDefault = true)
    // Channel 包要导正确 不然就会出现不能转换的异常
    public void handleMsg(Message message, Channel channel) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            System.out.println("开始处理信息");
            System.out.println("[传输消息]: " + new String(message.getBody()) + ", [deliveryTag]: " + deliveryTag);
            int i = 3/0; // 异常情况
            System.out.println("信息处理完成");
            // 成功的话也要确认（手动确认模式）
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            // 这个会 requeue设为true 重新添加到队列中 所以它就会死循环
            channel.basicNack(deliveryTag, false, false);
        }
    }

//    @RabbitHandler(isDefault = true)
//    public void handleMsg(Message message, Channel channel) throws IOException {
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
//        try {
//            System.out.println("开始处理信息");
//            System.out.println("[传输消息]: " + new String(message.getBody()) + ", [deliveryTag]: " + deliveryTag);
//            int i = 3/0; // 异常情况
//            System.out.println("信息处理完成");
//            // 成功的话也要确认（手动确认模式）
//            channel.basicAck(deliveryTag, false);
//        } catch (IOException e) { // IOException就不行 因为 3/0不会被这个捕获
//            // 这个会 requeue设为true 重新添加到队列中 所以它就会死循环
//            channel.basicNack(deliveryTag, false, false);
//        }
//    }


}
